package com.leeon.generics;

import java.util.Iterator;
import java.util.Random;

public class CoffeeGenerator implements Generator<Coffee>,Iterable<Coffee>{

	private Class[] types = {Latte.class,Mocha.class,
			Cappuccino.class,Americano.class,Breve.class};
	
	private static Random rand = new Random(47);
	
	private int size = 0;
	
	public CoffeeGenerator() {
	}
	
	public CoffeeGenerator(int sz){
		size = sz;
	}
	
	@Override
	public Iterator<Coffee> iterator() {
		return new CoffeeIterator();
	}

	@Override
	public Coffee next() {
		try {
			return (Coffee)(types[rand.nextInt(types.length)].newInstance());
		} catch (InstantiationException | IllegalAccessException e) {
			throw new RuntimeException();
		}
	}
	
	class CoffeeIterator implements Iterator<Coffee>{

		int count = size;
		
		@Override
		public boolean hasNext() {
			return count > 0;
		}

		@Override
		public Coffee next() {
			count--;
			return CoffeeGenerator.this.next();
		}

		@Override
		public void remove() {
			throw new RuntimeException();
		}
		
	}
	
	public static void main(String[] args){
		CoffeeGenerator generator = new CoffeeGenerator();
		for (int i = 0; i < 5; i++) {
			System.out.println(generator.next());
		}
		
		for (Coffee coffee : new CoffeeGenerator(5)) {
			System.out.println(coffee);
		}
	}

}
